#include <stdio.h>

int main() {
    int n;
    // 输入行数 n，题目要求 n ≤ 5
    // 杨辉三角特性：第1行1个元素，第2行2个元素，...，第n行n个元素
    scanf("%d", &n);

    // 定义二维数组存储杨辉三角，因为 n 最大为 5，所以定义 5x5 足够
    // 数组初始值全部设为0，后续会根据杨辉三角规则填充
    int triangle[5][5] = {0};

    // 填充杨辉三角的核心逻辑
    // 外层循环 i 控制行数（从0开始计数，0对应第1行，n-1对应第n行）
    for (int i = 0; i < n; i++) {
        // 杨辉三角规则1：每行的第一个元素（索引0）和最后一个元素（索引i）都是1
        triangle[i][0] = 1;
        triangle[i][i] = 1;

        // 填充中间元素（仅当行数i ≥ 2时才有中间元素）
        // 内层循环 j 控制列数，范围是1到i-1（跳过已设置的首尾元素）
        for (int j = 1; j < i; j++) {
            // 杨辉三角规则2：中间元素的值 = 上一行前一列元素 + 上一行当前列元素
            // 即 triangle[i][j] = 左上角元素 + 右上角元素
            triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
        }
    }

    // 倒序输出杨辉三角（从最后一行到第一行）
    // 外层循环 i 从最后一行索引（n-1）开始，递减到0
    for (int i = n - 1; i >= 0; i--) {
        // 内层循环 j 输出当前行的所有元素（共i+1个，从索引0到i）
        for (int j = 0; j <= i; j++) {
            // 元素间用空格分隔，使输出格式整齐
            printf("%d ", triangle[i][j]);
        }
        // 每行输出结束后换行，实现三角形的分行显示
        printf("\n");
    }

    return 0;
}
    